﻿import type { RequestOptions } from '@@/plugin-request/request';
import type { RequestConfig } from '@umijs/max';
import { message } from 'antd';
import { getToken } from './pages/utils';
import { blobValidate } from './utils';

// 错误处理方案： 错误类型
enum ErrorShowType {
  SILENT = 0,
  WARN_MESSAGE = 1,
  ERROR_MESSAGE = 2,
  NOTIFICATION = 3,
  REDIRECT = 9,
}
// 与后端约定的响应数据格式
interface ResponseStructure {
  success: boolean;
  data: any;
  errorCode?: number;
  errorMessage?: string;
  showType?: ErrorShowType;
}
let timer: NodeJS.Timeout;
/**
 * @name 错误处理
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */
let lock = false;
export const errorConfig: RequestConfig = {
  // 错误处理： umi@3 的错误处理方案。
  errorConfig: {
    // 错误抛出
    // errorThrower: (res) => {
    //   const { success, data, errorCode, errorMessage, showType } =
    //     res as unknown as ResponseStructure;
    //   if (!success) {
    //     const error: any = new Error(errorMessage);
    //     error.name = "BizError";
    //     error.info = { errorCode, errorMessage, showType, data };
    //     throw error; // 抛出自制的错误
    //   }
    // },
    // 错误接收及处理
    // errorHandler: (error: any, opts: any) => {
    //   if (opts?.skipErrorHandler) throw error;
    //   // 我们的 errorThrower 抛出的错误。
    //   if (error.name === "BizError") {
    //     const errorInfo: ResponseStructure | undefined = error.info;
    //     if (errorInfo) {
    //       const { errorMessage, errorCode } = errorInfo;
    //       switch (errorInfo.showType) {
    //         case ErrorShowType.SILENT:
    //           // do nothing
    //           break;
    //         case ErrorShowType.WARN_MESSAGE:
    //           message.warning(errorMessage);
    //           break;
    //         case ErrorShowType.ERROR_MESSAGE:
    //           message.error(errorMessage);
    //           break;
    //         case ErrorShowType.NOTIFICATION:
    //           notification.open({
    //             description: errorMessage,
    //             message: errorCode,
    //           });
    //           break;
    //         case ErrorShowType.REDIRECT:
    //           // TODO: redirect
    //           break;
    //         default:
    //           message.error(errorMessage);
    //       }
    //     }
    //   } else if (error.response) {
    //     // Axios 的错误
    //     // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
    //     message.error(`Response status:${error.response.status}`);
    //   } else if (error.request) {
    //     // 请求已经成功发起，但没有收到响应
    //     // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例，
    //     // 而在node.js中是 http.ClientRequest 的实例
    //     message.error("None response! Please retry.");
    //   } else {
    //     // 发送请求时出了点问题
    //     message.error("Request error, please retry.");
    //   }
    // },
  },

  // 请求拦截器
  requestInterceptors: [
    (config: RequestOptions) => {
      // 拦截请求配置，进行个性化处理。
      // 在header里添加token
      config.headers = {
        ...config.headers,
        Authorization: `Bearer ${getToken()}`,
      };
      // const url = config?.url?.concat("?token=123");
      return {
        ...config,
        // url
      };
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    (response) => {
      // 拦截响应数据，进行个性化处理
      const { data } = response as unknown as ResponseStructure;
      const isBlob = blobValidate(data);
      // console.log(data);
      if (isBlob && !data?.code) {
        return response;
      }
      const { msg } = data || {};
      const success = data?.code === 200;
      const isGet = response.config.method === 'get';
      // console.log("response-interceptors", response, isGet);
      // 401
      if (data?.code === 401 && !lock) {
        message.error('未授权，请登录！');
        lock = true;
        //如果当前不是"/user/login"

        clearTimeout(timer);
        //跳转到登录页
        timer = setTimeout(() => {
          lock = false;
          console.log(
            '跳转到登录页',
            window.location.pathname.indexOf('/user/login'),
          );
          // window.location.href = "/user/login";
          if (
            //
            window.location.pathname.indexOf('/user/login') === -1
          ) {
            window.location.href = '/user/login';
          }
        }, 2000);
      } else if (data?.code === 403) {
        message.error(msg || '拒绝访问！');
      }
      switch (data?.code) {
        case '15':
          message.error(msg);

          break;

        default:
          break;
      }
      //url 不包含 /file/upload
      if (
        !isGet &&
        !success &&
        data?.code !== 401 &&
        response.config.url?.indexOf('/file/upload') === -1
      ) {
        message.error(msg || '请求失败！');
      }
      // if (data?.code !== 200) {
      //   let msg = "请求失败！";
      //   switch (data?.code) {
      //     case 401:
      //       msg = "未授权，请登录！";
      //       break;
      //     case 403:
      //       msg = "拒绝访问！";
      //       break;
      //     case 404:
      //       msg = "请求错误,未找到该资源！";
      //       break;
      //     case 500:
      //       msg = "服务器端出错！";
      //       break;
      //     default:
      //       msg = data?.msg || msg;
      //   }
      //   message.error(msg);
      // }
      if (response.data) {
        response.data.success = success as any;
      }
      return response;
    },
  ],
};
